<?php 
/**
 * 高层次的代码不应该依赖低层次的代码。高层次的代码应该依赖抽象接口，不应该依赖于具体实现。
 */

class AuthenticatorDemo {
	public function __construct(DatabaseConnection $db)
	{
		$this->db = $db;
	}

	public function findUser($id)
	{
		return $this->db->exec('select * from users where id = ?', array($id));
	}

	public function authenticate($credentials) {
		// authenticate the user
	}
}
// Authenticator依赖了低层的DatabaseConnection, 该认证和数据库紧密的耦合在一起了
// 【高层次代码】 用于封装复杂的业务逻辑并且依靠低层次代码来实现功能，但不能直接和低层次代码偶合在一起
// 【低层次代码】用于实现一些低层的基本操作，比如从磁盘读取文件、操作数据库等



interface UserProviderInterface {
	public function find($id);
	public function findByUsername($username);
}

// 修改为依赖两个高层级的抽象
class Authenticator {
	public function __construct(UserProviderInterface $users, HasherInterface $hash)
	{
		$this->hash = $hash;
		$this->users = $users;
	}

	public function findUser($id)
	{
		return $this->users->find($id);
	}

	public function authenticate($credentials)
	{
		$user = $this->users->findByUsername($credentials['username']);
		return $this->hash->make($credentials['password']) == $user->password;
	}
}


// accessId 没问题
// privateKey 正确

// bizId
//  account
// address
// mykmsKeyId
// contractName
// tenantid